package com.cw.DesignModel23.Structural.ProxyPattern.Proxy2;

import com.cw.DesignModel23.Structural.ProxyPattern.Proxy1.RealSubject;
import com.cw.DesignModel23.Structural.ProxyPattern.Proxy1.Subject;

import java.lang.reflect.Proxy;

/**
 * 动态代理使用流程 :
 *
 * ① 创建目标对象 : 创建 目标对象 接口 ;
 *
 * ② 创建被代理对象 : 创建 被代理对象 , 实现 目标对象 接口 ;
 *
 * ③ 创建调用处理程序 : 创建 InvocationHandler 子类对象 , 内部持有 被代理对象 , 在 invoke 方法中 , 返回 method.invoke(subject, args) ;
 *
 * ④ 动态创建代理对象 : 调用 Proxy.newProxyInstance 创建 代理对象 实例对象 , 由 JVM 自动创建代理对象类 , 然后再创建对应的实例对象 ;
 *
 * ⑤ 动态代理调用 : 调用 代理对象 实例的相关 目标对象 接口 方法 ;
 * ————————————————
 * 版权声明：本文为CSDN博主「韩曙亮」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/shulianghan/article/details/120389258
 */
public class Client {
    public static void main(String[] args) {
        // 被代理对象
        Subject realSubject = new RealSubject();

        // 创建调用处理程序 , 内部持有被代理对象
        DynamicInvocationHandler dynamicInvocationHandler =
                new DynamicInvocationHandler(realSubject);

        // 生成动态代理类
        Subject subject = (Subject) Proxy.newProxyInstance(
                realSubject.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(),
                dynamicInvocationHandler);

        // 动态代理调用
        subject.request();
    }
}

